package com.autoboot.service;

import com.autoboot.domain.query.QueryMultiBo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;

/**
 * 动态表服务接口
 * @author Maosw
 */
public interface DynamicTableService {

    /**
     * 获取表中所有数据
     *
     * @param tableName 表名
     * @return 数据列表
     */
    List<Map<String, Object>> listFromTable(String tableName);

    /**
     * 根据复杂条件获取表中数据
     *
     * @param tableName 表名
     * @param conditions 等值条件Map
     * @param likes 模糊查询条件
     * @param gt 大于条件
     * @param ge 大于等于条件
     * @param lt 小于条件
     * @param le 小于等于条件
     * @param between 区间条件
     * @param orders 排序条件
     * @return 数据列表
     */
    List<Map<String, Object>> listByConditionFromTable(
            String tableName,
            Map<String, Object> conditions,
            List<Map<String, String>> likes,
            List<Map<String, Object>> gt,
            List<Map<String, Object>> ge,
            List<Map<String, Object>> lt,
            List<Map<String, Object>> le,
            List<Map<String, Object>> between,
            List<Map<String, String>> orders);

    /**
     * 根据ID获取表中的数据
     *
     * @param tableName 表名
     * @param id ID值
     * @return 数据详情
     */
    Map<String, Object> getByIdFromTable(String tableName, String idField, Object id);

    /**
     * 分页查询表数据(支持复杂条件)
     *
     * @param tableName 表名
     * @param current 当前页码
     * @param size 每页大小
     * @param conditions 等值条件Map
     * @param likes 模糊查询条件
     * @param gt 大于条件
     * @param ge 大于等于条件
     * @param lt 小于条件
     * @param le 小于等于条件
     * @param between 区间条件
     * @param orders 排序条件
     * @return 分页数据
     */
    Page<Map<String, Object>> pageFromTable(
            String tableName,
            long current,
            long size,
            Map<String, Object> conditions,
            List<Map<String, String>> likes,
            List<Map<String, Object>> gt,
            List<Map<String, Object>> ge,
            List<Map<String, Object>> lt,
            List<Map<String, Object>> le,
            List<Map<String, Object>> between,
            List<Map<String, String>> orders);

    /**
     * 保存数据到表
     *
     * @param tableName 表名
     * @param data 数据Map
     * @return 保存结果
     */
    boolean saveToTable(String tableName, Map<String, Object> data);

    /**
     * 批量保存数据到表
     *
     * @param tableName 表名
     * @param dataList 数据列表
     * @return 保存结果
     */
    boolean saveBatchToTable(String tableName, List<Map<String, Object>> dataList);

    /**
     * 更新表数据
     *
     * @param tableName 表名
     * @param data 数据Map，必须包含ID字段
     * @return 更新结果
     */
    boolean updateToTable(String tableName, String idField, Map<String, Object> data);

    /**
     * 从表中删除数据
     *
     * @param tableName 表名
     * @param id ID值
     * @return 删除结果
     */
    boolean removeFromTable(String tableName, String idField, Object id);

    /**
     * 根据条件从表中删除数据
     *
     * @param tableName 表名
     * @param conditions 条件Map
     * @return 删除结果
     */
    boolean removeByConditionFromTable(String tableName, Map<String, Object> conditions);

    /**
     * 执行自定义SQL查询
     *
     * @param sqlStatement SQL语句
     * @param paramMap 参数Map
     * @return 查询结果
     */
    List<Map<String, Object>> executeQuery(String sqlStatement, Map<String, Object> paramMap);

    /**
     * 获取表结构信息
     *
     * @param tableName 表名
     * @return 表结构信息列表
     */
    List<Map<String, Object>> getTableStructure(String tableName);

    /**
     * 多表分页查询
     *
     * @param queryMultiBo 查询参数
     * @return 分页结果
     */
    Page<Map<String, Object>> pageMultiFromTable(QueryMultiBo queryMultiBo);
}
